home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / cli / mx2src.arc / NEWSYS.MOD < prev    next >
Text File  |  1989-01-05  |  12KB  |  265 lines

  1.  
  2. (*              Copyright 1987 fred brooks LogicTek             *)
  3. (*                                                              *)
  4. (*                                                              *)
  5. (*  1.0.0 First Release                      12/8/87-FGB        *)
  6. (*  1.0.1 Changed to trap #9 because of possible conflict with  *)
  7. (*        JSM2 coroutines                    12/9/87-FGB        *)
  8. (*                                                              *)
  9.  
  10. IMPLEMENTATION MODULE NEWSYS; (*$S-,$T- *)
  11. FROM           SYSTEM   IMPORT  ADDRESS,CODE,SETREG,REGISTER,ADR;
  12.  
  13. FROM    GEMDOS  IMPORT  Super,Alloc,Free; 
  14.  
  15. TYPE           trappointer      =       POINTER TO PROC;
  16.                processpointer   =       POINTER TO ADDRESS;
  17. TYPE           iotype   =       RECORD
  18.                                         p1      : processpointer;
  19.                                         p2      : processpointer;
  20.                                         device  : ADDRESS;
  21.                                 END;
  22. VAR            pc,ssv                           : ADDRESS;
  23.                io1,io2                          : processpointer;
  24.                sr,function                      : CARDINAL;
  25.                iotranspointer                   : iotype;
  26.                trap                             : trappointer;
  27.                pr1,pr2,wsp                      : ADDRESS;
  28.                n                                : LONGCARD;
  29.                init                             : BOOLEAN;
  30.  
  31. PROCEDURE  NEWPROCESS(processProc       :  PROC;
  32.                       workspace         :  ADDRESS;
  33.                       worksize          :  LONGCARD;
  34.                       VAR process       :  ADDRESS);
  35. BEGIN
  36.         IF NOT init THEN
  37.            INITPROCESSES;
  38.         END;
  39.         workspace:=workspace+ADDRESS(worksize);
  40.         SETREG(6,ADDRESS(processProc));
  41.         SETREG(8,workspace);
  42.         CODE(2106H);    (* move.l d6,-(a0) PC *)
  43.         CODE(313cH,0300H);      (* move.w $0300,-(a0)   CCR  *)
  44.         CODE(48e0H,0fffeH);     (* movem.l d0-d7/a0-a6,-(a0) *)
  45.         process:=REGISTER(8);
  46. END        NEWPROCESS;
  47.  
  48. PROCEDURE  TRANSFER(VAR p1,p2: ADDRESS);
  49. BEGIN      (* pass p1 and p2 as the location of these variables *)
  50.         IF NOT init THEN
  51.            INITPROCESSES;
  52.         END;
  53.            SETREG(0,ADR(p2));
  54.            CODE(2f00H); (* move.l d0,-(sp) *)
  55.            SETREG(0,ADR(p1));
  56.            CODE(2f00H); (* move.l d0,-(sp) *)
  57.            CODE(3f3cH,1); (* move.w #1,-(sp) *)
  58.            CODE(4e49H); (* trap #9 *)
  59.            CODE(0dffcH,0,10); (* add.l #10,sp *)
  60. END        TRANSFER;
  61.  
  62. PROCEDURE  IOTRANSFER(VAR p1,p2: ADDRESS; device: ADDRESS);
  63. BEGIN      (* pass p1 and p2 as the location of these variables *)
  64.         IF NOT init THEN
  65.            INITPROCESSES;
  66.         END;
  67.            SETREG(0,device);
  68.            CODE(2f00H); (* move.l d0,-(sp) *)
  69.            SETREG(0,ADR(p2));
  70.            CODE(2f00H); (* move.l d0,-(sp) *)
  71.            SETREG(0,ADR(p1));
  72.            CODE(2f00H); (* move.l d0,-(sp) *)
  73.            CODE(3f3cH,2); (* move.w #2,-(sp) *)
  74.            CODE(4e49H); (* trap #9 *)
  75.            CODE(0dffcH,0,14); (* add.l #14,sp *)
  76. END        IOTRANSFER;
  77.  
  78. (*$P- *)
  79. PROCEDURE       PTRAP; 
  80. BEGIN
  81.         CODE(043374B,2700H); (* disable ints *)
  82.         CODE(48e7H,0fffeH);   (* save regs movem  *)
  83.         CODE(306fH,60); (* move.w 60(a7),a0 get sr *)
  84.         sr:=CARDINAL(REGISTER(8));
  85.         IF sr>3fffH THEN         (* called from supermode, not valid *)
  86.            CODE(4cdfH,7fffH);    (* restore regs movem *)
  87.            CODE(4e73H);          (* rte go back to where we came from *)
  88.         END;
  89.  
  90.         CODE(4e69H);        (* move.l usp,a1 *)
  91.         CODE(3069H,0);      (* move.w 0(a1),a0 *)
  92.         function:=CARDINAL(REGISTER(8));
  93.         CODE(4e69H);        (* move.l usp,a1 *)
  94.         CODE(2069H,2);      (* move.l 2(a1),a0 *)
  95.         iotranspointer.p1:=REGISTER(8);
  96.         CODE(4e69H);        (* move.l usp,a1 *)
  97.         CODE(2069H,6);      (* move.l 6(a1),a0 *)
  98.         iotranspointer.p2:=REGISTER(8);
  99.         CODE(4e69H);        (* move.l usp,a1 *)
  100.         CODE(2069H,10);     (* move.l 10(a1),a0 *)
  101.         iotranspointer.device:=REGISTER(8);
  102.  
  103.         CASE function OF
  104.              1  : CODE(4e68H); (* move.l usp,a0 TRANSFER *) (* SAVE *)
  105.                   CODE(0dffcH,0,42H); (* add.l #66,sp *)
  106.                   CODE(2127H); (* move.l -(sp),-(a0) D0 *)
  107.                   CODE(2127H); (* move.l -(sp),-(a0) D1 *)
  108.                   CODE(2127H); (* move.l -(sp),-(a0) D2 *)
  109.                   CODE(2127H); (* move.l -(sp),-(a0) D3 *)
  110.                   CODE(2127H); (* move.l -(sp),-(a0) D4 *)
  111.                   CODE(2127H); (* move.l -(sp),-(a0) D5 *)
  112.                   CODE(2127H); (* move.l -(sp),-(a0) D6 *)
  113.                   CODE(2127H); (* move.l -(sp),-(a0) D7 *)
  114.                   CODE(2127H); (* move.l -(sp),-(a0) A0 *)
  115.                   CODE(2127H); (* move.l -(sp),-(a0) A1 *)
  116.                   CODE(2127H); (* move.l -(sp),-(a0) A2 *)
  117.                   CODE(2127H); (* move.l -(sp),-(a0) A3 *)
  118.                   CODE(2127H); (* move.l -(sp),-(a0) A4 *)
  119.                   CODE(2127H); (* move.l -(sp),-(a0) A5 *)
  120.                   CODE(2127H); (* move.l -(sp),-(a0) A6 *)
  121.                   CODE(3127H); (* move.w -(sp),-(a0) SR *)
  122.                   CODE(2127H); (* move.l -(sp),-(a0) PC *)
  123.                   iotranspointer.p1^:=REGISTER(8); (* set p1 to process *)
  124.                   
  125.                   SETREG(8,iotranspointer.p2^); (* load p2 to a0 RESTORE *)
  126.                   CODE(2ed8H); (* move.l (a0)+,(sp)+ D0 *)
  127.                   CODE(2ed8H); (* move.l (a0)+,(sp)+ D1 *)
  128.                   CODE(2ed8H); (* move.l (a0)+,(sp)+ D2 *)
  129.                   CODE(2ed8H); (* move.l (a0)+,(sp)+ D3 *)
  130.                   CODE(2ed8H); (* move.l (a0)+,(sp)+ D4 *)
  131.                   CODE(2ed8H); (* move.l (a0)+,(sp)+ D5 *)
  132.                   CODE(2ed8H); (* move.l (a0)+,(sp)+ D6 *)
  133.                   CODE(2ed8H); (* move.l (a0)+,(sp)+ D7 *)
  134.                   CODE(2ed8H); (* move.l (a0)+,(sp)+ A0 *)
  135.                   CODE(2ed8H); (* move.l (a0)+,(sp)+ A1 *)
  136.                   CODE(2ed8H); (* move.l (a0)+,(sp)+ A2 *)
  137.                   CODE(2ed8H); (* move.l (a0)+,(sp)+ A3 *)
  138.                   CODE(2ed8H); (* move.l (a0)+,(sp)+ A4 *)
  139.                   CODE(2ed8H); (* move.l (a0)+,(sp)+ A5 *)
  140.                   CODE(2ed8H); (* move.l (a0)+,(sp)+ A6 *)
  141.                   CODE(3ed8H); (* move.w (a0)+,(sp)+ SR *)
  142.                   CODE(2ed8H); (* move.l (a0)+,(sp)+ PC *)
  143.                   CODE(9ffcH,0,42H); (* sub.l #66,sp *)
  144.                   CODE(4e60H); (* move.l a0,usp *)
  145.                   CODE(4cdfH,7fffH);    (* restore regs movem *)
  146.                   CODE(4e73H); |        (* rte *)
  147.  
  148.              2  : CODE(4e68H); (* move.l usp,a0 IOTRANSFER *) (* SAVE *)
  149.                   CODE(0dffcH,0,42H); (* add.l #66,sp *)
  150.                   CODE(2127H); (* move.l -(sp),-(a0) D0 *)
  151.                   CODE(2127H); (* move.l -(sp),-(a0) D1 *)
  152.                   CODE(2127H); (* move.l -(sp),-(a0) D2 *)
  153.                   CODE(2127H); (* move.l -(sp),-(a0) D3 *)
  154.                   CODE(2127H); (* move.l -(sp),-(a0) D4 *)
  155.                   CODE(2127H); (* move.l -(sp),-(a0) D5 *)
  156.                   CODE(2127H); (* move.l -(sp),-(a0) D6 *)
  157.                   CODE(2127H); (* move.l -(sp),-(a0) D7 *)
  158.                   CODE(2127H); (* move.l -(sp),-(a0) A0 *)
  159.                   CODE(2127H); (* move.l -(sp),-(a0) A1 *)
  160.                   CODE(2127H); (* move.l -(sp),-(a0) A2 *)
  161.                   CODE(2127H); (* move.l -(sp),-(a0) A3 *)
  162.                   CODE(2127H); (* move.l -(sp),-(a0) A4 *)
  163.                   CODE(2127H); (* move.l -(sp),-(a0) A5 *)
  164.                   CODE(2127H); (* move.l -(sp),-(a0) A6 *)
  165.                   CODE(3127H); (* move.w -(sp),-(a0) SR *)
  166.                   CODE(2127H); (* move.l -(sp),-(a0) PC *)
  167.                   iotranspointer.p1^:=REGISTER(8); (* set p1 to process *)
  168.                   io1:=iotranspointer.p1;
  169.                   
  170.                   io2:=iotranspointer.p2;
  171.                   SETREG(8,iotranspointer.p2^); (* load p2 to a0 RESTORE *)
  172.                   CODE(2ed8H); (* move.l (a0)+,(sp)+ D0 *)
  173.